04 | Diagnostische Analyse - Part 1
Was ist eine For-Schleife?
Eine For-Schleife ist eine Methode in der Programmierung, um wiederholende Aufgaben zu vereinfachen, indem sie eine bestimmte Aktion mehrmals nacheinander ausführt. Sie geht Schritt für Schritt durch eine Sammlung von Elementen und wendet auf jedes Element den gleichen Vorgang an, wodurch Zeit und Aufwand gespart werden.
Gründe für die Verwendung einer For-Schleife:
LÄNGE in jedem WortFor-Scheifen in Python sind konzeptionell das gleiche wie runterkopieren in Excel
Syntax in Python
Die Syntax einer For-Schleife in Python ist wie folgt:
element: Der Name der Variablen, die für jedes Element der Sammlung verwendet wird. Kann frei gewählt werden.in: Das Schlüsselwort, das die Schleife mit der Sammlung verbindet.collection: Die Sammlung, die durchlaufen werden soll. Kann jedes Objekt sein, das iterierbar ist, z. B. eine ListeBilden wir das Excel-Beispiel aus der vorherigen Folie in Python um.
name: Name der Variablen, die für jedes Element der Sammlung verwendet wird. Kann frei gewählt werden.anz_buchstaben: Name der Variablen, die für die Anzahl der Buchstaben verwendet wird. Kann frei gewählt werden.len(name): Die Funktion len() gibt die Länge eines Objekts zurück. In diesem Fall die Länge des Strings name.print(anz_buchstaben): Die Funktion print() gibt den Inhalt der Variablen anz_buchstaben aus.Wichtig: im Beispiel werden die Ergebnisse nur ausgegeben, jedoch nicht gespeichert.
die Variable
anz_buchstabenwird für jeden Durchlauf der Schleife neu definiert, d.h. der Inhalt der Variable wird überschriebendie Variable
anz_buchstabenhat nach dem letzten Durchlauf der Schleife den Wert der letzten Iteration
Beispiel: Ausgabe der Variable anz_buchstaben nach dem letzten Durchlauf der Schleife
Wenn wir die Ergebnisse der Berechnung speichern möchten, können wir eine leere Liste definieren und die Ergebnisse der Berechnung mit der Funktion append() hinzufügen.
Beispiel:
namen = ["Herbert", "Norbert", "Pit", "Tim", "Kunigunde"]
länge_namen = []
for name in namen:
anz_buchstaben = len(name)
länge_namen.append(anz_buchstaben)
länge_namen[7, 7, 3, 3, 9]
länge_namen: Name der Liste, in der die Ergebnisse gespeichert werden sollen. Kann frei gewählt werden.länge_namen.append(anz_buchstaben): Die Funktion append() fügt ein Element an das Ende der Liste an. In diesem Fall die Anzahl der Buchstaben anz_buchstaben.Wir haben eine Liste von Preisen (netto) und möchten für jeden Preis, den Preis inkl. Mehrwertsteuer (brutto) berechnen. Die Ergebnisse sollen in einer Liste gespeichert werden.
# Annahmen
preise = [10, 20, 30, 40, 50]
mehrwertsteuer_satz = 0.19
# For-Schleife zur Berechnung der Mehrwertsteuer
preise_brutto = []
for preis in preise:
preis_brutto = preis * (1 + mehrwertsteuer_satz)
preise_brutto.append(preis_brutto)
preise_brutto[11.899999999999999,
23.799999999999997,
35.699999999999996,
47.599999999999994,
59.5]
enumerate()Die Funktion enumerate() gibt ein Objekt zurück, das die Elemente einer Sammlung enthält und die Nummer des Elements enthält.
i: Nummer des Elements (beginnend bei 0)name: Element der Sammlungzip()Die Funktion zip() gibt ein Objekt zurück, das die Elemente mehrerer Sammlungen enthält.
vorname: Element der Sammlung vornamennachname: Element der Sammlung nachnamenrange()Die Funktion range() gibt ein Objekt zurück, das eine Sequenz von Zahlen enthält.
i: Element der Sequenz von Zahlen, die von range() zurückgegeben wirdrange kann mit drei Argumenten aufgerufen werden: range(start, stop, step)
start: Startwert der Sequenz (Standardwert: 0)stop: Stopwert der Sequenz (Standardwert: 1)step: Schrittweite der Sequenz (Standardwert: 1)range(1, 10, 2) gibt die Sequenz 1, 3, 5, 7, 9 zurückAufgabenstellung:
In dieser Übungsaufgabe erhaltet ihr eine Liste mit täglichen Aktienkursen eines Unternehmens für einen Monat. Eure Aufgabe besteht darin, die rollierenden Durchschnittskurse für einen Zeitraum von 5 Tagen zu berechnen und auszugeben.
Anforderungen:
Verwende eine For-Schleife, um durch die Liste der Aktienkurse zu iterieren.
Berechne den 5-Tage-Durchschnitt für jeden Kurs in der Liste, beginnend mit dem fünften Tag.
Speichere die berechneten Durchschnittskurse in einer neuen Liste.
Speicher Aktienkurse und Durchschnittskurse in einem DataFrame
Plotte die Aktienkurse und die Durchschnittskurse in einem Diagramm.
# Liste der Aktienkurse
aktienkurse = [100, 102, 99, 101, 98, 95, 97, 93, 96, 92, 90, 87, 89, 85, 84, 86, 88, 87, 91, 92, 94, 96, 93, 95, 97, 94, 92, 89, 91, 88]
# Leere Liste für die rollierenden Durchschnittskurse
rollierende_durchschnitte = []
# For-Schleife zur Berechnung der rollierenden Durchschnittskurse
for i in range(len(aktienkurse) - 4):
durchschnitt = sum(aktienkurse[i:i + 5]) / 5
rollierende_durchschnitte.append(durchschnitt)
# Speichern in DataFrame
data = pd.DataFrame({"Kurs": aktienkurse})
data.loc[4:, "MA"] = rollierende_durchschnitte
# Plotte als Liniendiagramm (alternative: data.plot())
sns.lineplot(data=data, x=data.index, y="Kurs")
sns.lineplot(data=data, x=data.index, y="MA")
plt.title("Aktienkurse und rollierende Durchschnitte")
plt.xlabel("Tag")
plt.legend(["Kurs", "MA"]);Rollierender Durchschnitt sollte - bei obigen Beispiel - im Idealfall mit eigener Funktion berechnet werden.
Beispiel:
Rollierender Durchschnitt kann in Pandas einfach berechnet werden.
Beispiel:
# Liste der Aktienkurse
aktienkurse = [100, 102, 99, 101, 98, 95, 97, 93, 96, 92,
90, 87, 89, 85, 84, 86, 88, 87, 91, 92, 94,
96, 93, 95, 97, 94, 92, 89, 91, 88]
# Speichern in DataFrame
data = pd.DataFrame({"Kurs": aktienkurse})
# Berechnung des rollierenden Durchschnitts
data["MA"] = data["Kurs"].rolling(5).mean()Ziele dieses Kapitels
Lineare Regression ist eine der flexibelsten und am häufigsten verwendeten statistischen Methoden in Forschung und betrieblicher Praxis. Sie wird verwendet, um die Beziehung zwischen einer abhängigen und einer oder mehreren unabhängigen Variablen zu analysieren.
Lineare Regression wird verwendet für
Der primäre Anwendungsfall für die lineare Regressionsanalyse ist die Analyse von kausalen Beziehungen.
Diese Beziehung kann ausgedrückt werden als
\[y = f(x)\]
Einfache (lineare) Regression:
Wenn wir ausdrücken möchten, dass wir an eine Beziehung zwischen Umsatz und Preis glauben, können wir dies wie folgt angeben:
\[\text{Umsatz} = f(\text{Preis})\]
Mit Hilfe der linearen Regression kann diese Beziehung quantifiziert werden, d.h. wir können bestimmen, wie stark sich der Umsatz ändert, wenn wir den Preis ändern.
Stochastisches Modell:
Es ist sehr unwahrscheinlich, dass die Beziehung zwischen den oben genannten Variablen vollständig deterministisch ist (wie in der obigen Formel angenommen). Daher müssen wir dem Modell Unsicherheit hinzufügen. Das resultierende stochastische Modell wird häufig in der Regressionsanalyse verwendet und ist wie folgt beschrieben:
\[\hat{y} = f(x) + \epsilon\]
Hier ist \(\epsilon\) eine Zufallsvariable (genannt Fehlerterm / Residuum), die nicht beobachtet werden kann und angenommen wird, dass sie einer Standardnormalverteilung folgt (d.h. \(\epsilon \sim N(0,1)\)).
Das stochastische Modell wird benötigt, um die Regressionsmodelle mit Hilfe von statistischen Tests zu bewerten.
In vielen (wenn nicht den meisten) Forschungs- oder Geschäftsfragen können wir keine monokausale Beziehung annehmen.
Stattdessen wird \(y\) wahrscheinlich von zahlreichen Faktoren beeinflusst.
In unserem obigen Beispiel können Umsätze auch von den Werbeausgaben abhängen, aber auch von anderen Faktoren wie dem Zustand der Wirtschaft, dem Preis, dem Verhalten der Wettbewerber usw.
Für eine solche Beziehung verwenden wir eine multiple Regressionsanalyse, die wie folgt ausgedrückt werden kann:
\[ \begin{aligned} \\[10pt] &y = f(X) \\[15pt] \text{wobei} \ &X = \begin{bmatrix} 1 & x_{12} & \cdots & x_{1p} \\ 1 & x_{22} & \cdots & x_{2p} \\ \vdots & \vdots & \ddots & \vdots \\ 1 & x_{n2} & \cdots & x_{np} \\ \end{bmatrix} \end{aligned} \]
https://pbs.twimg.com/media/EzSYVwnVIAUG6v9?format=jpg&name=small
Wichtig:
Während wir versuchen, eine kausale Beziehung zwischen \(y\) und \(X\) zu modellieren, können wir in der Praxis nicht feststellen, ob die Beziehung tatsächlich kausal ist.
Stattdessen approximieren wir Kausalität, indem wir die Korrelation bewerten.
Typische Hypothesen, die unter anderem mit linearer Regression angesprochen werden können:
| # | Hypothese | Abhängige Variable | Unabhängige Variable |
|---|---|---|---|
| 1 | Ist der Umsatz pro Verkäufer abhängig von der Anzahl der Kundenbesuche? | Umsatz pro Verkäufer (pro Zeitraum) | Anzahl Kundenbesuche pro Verkäufer (pro Zeitraum) |
| 2 | Ändert sich der Umsatz, wenn die Werbeausgaben verdoppelt werden? | Umsatz pro Zeitraum | Werbeausgaben pro Zeitraum |
| 3 | Wie wirkt sich eine Preiserhöhung von x% auf den Umsatz aus, wenn gleichzeitig die Werbeausgaben um 10% erhöht werden? | Umsatz pro Zeitraum | Werbeausgaben, Preis, … |
| 4 | … | … | … |
Was ist ein Modell?
Lineare Regressionsmodelle sind recht einfach, aber dennoch für viele Forschungs- und praktische Probleme sehr geeignet
Datensatz:
Im Folgenden verwenden wir den Werbedatensatz aus “Introduction to Statistical Learning1 für die folgenden Beispiele. Der Datensatz enthält
Verkäufe in Tausend Einheiten
Werbebudgets in Tausenden von Dollar für TV, Radio und Zeitungen
| TV | radio | newspaper | sales | |
|---|---|---|---|---|
| 0 | 230.1 | 37.8 | 69.2 | 22.1 |
| 1 | 44.5 | 39.3 | 45.1 | 10.4 |
| 2 | 17.2 | 45.9 | 69.3 | 9.3 |
| 3 | 151.5 | 41.3 | 58.5 | 18.5 |
| 4 | 180.8 | 10.8 | 58.4 | 12.9 |
usecols ist eine Liste der Spalten, die wir aus der CSV-Datei auslesen möchten.Nehmen wir an, wir glauben an eine einfache lineare Beziehung zwischen Verkäufen und den TV-Werbeausgaben. Wir können dies als
\[\text{sales} = f(\text{TV})\]
beschreiben.
Dies impliziert, dass wir an eine kausale Beziehung zwischen beiden Variablen glauben. Konkret glauben wir, dass die TV-Werbeausgaben die Verkäufe antreiben oder beeinflussen.
Regressionsfunktion:
Ein einfaches lineares Regressionsmodell der oben genannten Formulierung könnte sein:
\[\hat{y} = \hat{\beta}_0 + \hat{\beta}_1x \]
wobei \(\hat{y}\) die Vorhersage der abhängigen Variable \(y\) bei gegebenem \(X\) bezeichnet. \(\hat{\beta}_0\) und \(\hat{\beta}_1\) sind die Koeffizientenschätzungen.
Für unser Beispiel sieht die Regressionsfunktion wie folgt aus:
\[\text{sales} = \hat{\beta}_0 + \hat{\beta}_1\text{TV}\]
Da die mathematische Formulierung eine Linie impliziert, stellt \(\beta_0\) den Schnittpunkt der Linie mit der y-Achse dar und \(\beta_1\) repräsentiert die Steigung der Linie.
Nehmen wir an, dass \(\beta_0\) gleich \(20\) und \(\beta_1\) gleich \(5\) ist. Dies würde bedeuten, dass unser Regressionsmodell wie folgt aussieht:
\[\text{Sales} = 20+ 5\cdot\text{TV}\]
Dies würde bedeuten, dass wir \(x\) (d.h. die Höhe der Ausgaben für TV-Werbung) einsetzen und \(\hat{y}\) (d.h. unsere auf \(x\) basierenden Umsatzprognosen) berechnen könnten.
Wenn wir zum Beispiel annehmen, dass wir 100 $ für TV-Werbung ausgegeben haben, würden wir Sales von
\[\text{Sales} = 20 + 5\cdot100 = 520\]
Wenn wir \(100.000\) USD für TV-Werbung ausgeben, würden wir nach unserem Modell \(520.000\) an Sales erzielen.
Wir müssen Koeffizienten finden, die eine Linie angeben, die die wahre Beziehung so gut wie möglich beschreibt.
Dies wird durch die Minimierung des Kleinste-Quadrate-Kriteriums erreicht, d.h. wir wollen die Residualsumme der Quadrate (RSS; manchmal SSR) minimieren
\[ \text{RSS} = \sum_{i=1}^n e_i^2 \]
wobei \(e_i\) definiert ist als
\[ e_i = y_i - \hat{y}_i \]
Analytisch können wir dann \(\beta_0\) und \(\beta_1\) so ableiten, dass die RSS minimiert wird:
\[ \begin{equation} \begin{split} \hat{\beta}_1 & = \frac{\sum_{i=1}^n (x_i - \bar{x})(y_i - \bar{y})}{\sum_{i=1}^n (x_i - \bar{x})^2}\\[10pt] \hat{\beta}_0 & = \bar{y} - \hat{\beta}_1\bar{x} \end{split} \end{equation} \]
Wir schreiben \(\hat{\beta}_i\), um anzuzeigen, dass es sich um einen Schätzer handelt. Wir lassen es weg, wenn es aus dem Kontext klar ist.
Für die meisten Fragen benötigen wir mehr als eine unabhängige Variabel. Wenn dies der Fall ist, hat das Regressionsmodell die folgende Form:
\[\hat{y} = \beta_0 + \beta_1x_1 + \beta_2x_2 + \ldots + \beta_px_p\]
Beispiel:
Wir könnten die Beziehung zwischen Absatz und Werbeausgaben unter Verwendung aller drei Medienarten, Fernsehen, Zeitung und Radio, beschreiben. Dies würde dann wie folgt beschrieben werden:
\[\text{Sales} = \beta_0 + \beta_1\text{TV} + \beta_2\text{newspaper} + \beta_3\text{radio}\]
Um für \(\beta_j\) zu lösen, gehen wir im Grunde genommen denselben Weg wie im einfachen Regressionsfall. Das Lösen des Gleichungssystems ist jedoch etwas komplexer. Es beinhaltet das Lösen eines Systems linearer Gleichungen der folgenden Form:
\[y = X\beta + \epsilon\]
wobei:
\[ \begin{equation} y = \begin{pmatrix} y_1 \\ y_2 \\ \vdots \\ y_n \end{pmatrix}, X = \begin{pmatrix} 1 & x_{11} & x_{12} & \ldots & x_{1p} \\ 1 & x_{21} & x_{22} & \ldots & x_{2p} \\ \vdots & \vdots & \vdots & \vdots & \vdots \\ 1 & x_{n1} & x_{n2} & \ldots & x_{np} \end{pmatrix}, \beta = \begin{pmatrix} \beta_0 \\ \vdots \\ \beta_p \end{pmatrix}, \epsilon = \begin{pmatrix} \epsilon_0 \\ \epsilon_1 \\ \vdots \\ \epsilon_n \end{pmatrix}, \end{equation} \]
Ohne auf die Details der Mathematik einzugehen, kann diese Gleichung wie folgt gelöst werden:
\[ \hat{\beta} = (X^TX)^{-1}X^Ty = X^{-1} \cdot y \]
Ansatz 1: manuelle Implementierung der analytischen Lösung
Ansatz 2: Modul statsmodels nutzen
Modul statsmodels kann auch für multiple Regressionen genutzt werden:
import statsmodels.formula.api as smf
# Modell definieren und Daten übergeben
model = smf.ols("sales ~ TV + newspaper + radio", data=df)
# Modellschätzung (engl: "fitting")
model = model.fit()
paras = model.params # Modellparameter
print(paras)Intercept 2.938889
TV 0.045765
newspaper -0.001037
radio 0.188530
dtype: float64
1. Prognose:
Das endgültige Modell kann verwendet werden, um die Frage zu beantworten
2. Diagnose und Schlussfolgerung:
Das endgültige Modell kann verwendet werden, um Fragen wie folgende zu beantworten: